﻿/*
    Copyright (C) 2012  Milton da Silva Junior - admin.jr.dotnet@gmail.com

    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <http://www.gnu.org/licenses/>.

 */

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using Loja.Models;
using Loja.Business;
using Loja.Data;
using System.Text;
using Telerik.Web.Mvc;
using Loja.DataDTO;

namespace Loja.Controllers
{
    public class ProductController : BaseController
    {
        //
        // GET: /Product/

        [NonAction]
        private void GetCategoria()
        {
            CategoriaBLL categoriaBll = new CategoriaBLL();
            ViewData["Categoria"] = categoriaBll.GetCategorias();

        }

        public JsonResult GetSubcategorias(int idCategoria)
        {
            CategoriaBLL categoriaBll = new CategoriaBLL();
            return Json(categoriaBll.GetSubcategorias(idCategoria), JsonRequestBehavior.AllowGet);
        }

        [NonAction]
        private void GetFornecedores()
        {
            FornecedorBLL fornecedorBll = new FornecedorBLL();
            ViewData["Fornecedor"] = fornecedorBll.GetFornecedor();
        }

        [NonAction]
        private void GetMarcas()
        {
            MarcaBLL marcaBll = new MarcaBLL();
            ViewData["Marca"] = marcaBll.GetMarca();
        }

        public ActionResult Index()
        {
            ViewData["Controller"] = "Product";
            ViewData["ActionListarTodos"] = @"~\Product\GetListaProduto";

            PessoaBLL pessoaBll = new PessoaBLL(false);
            pessoaBll.GetClientes();

            return View("Index", MontarColunasFiltro());
        }

        [NonAction]
        private void PreencherCombos()
        {
            GetCategoria();
            GetFornecedores();
            GetMarcas();
        }

        [NonAction]
        private List<SelectListItem> MontarColunasFiltro()
        {
            List<PequisaModels> colunas = new List<PequisaModels>();

            colunas.Add(new PequisaModels { TipoFiltro = 0, Descricao = "Selecione" });
            colunas.Add(new PequisaModels { TipoFiltro = 1, Descricao = "Código"});
            colunas.Add(new PequisaModels { TipoFiltro = 2, Descricao = "Categoria" });
            colunas.Add(new PequisaModels { TipoFiltro = 3, Descricao = "Subcategoria" });
            colunas.Add(new PequisaModels { TipoFiltro = 4, Descricao = "Fornecedor" });
            colunas.Add(new PequisaModels { TipoFiltro = 5, Descricao = "Marca" });

            SelectList selectList = new SelectList(colunas, "TipoFiltro", "Descricao", 0);
            return selectList.ToList();
            
        }

     
        //
        // GET: /Product/Details/5

        public ActionResult Details(int id)
        {
            return View();
        }

        //
        // GET: /Product/Create

        public ActionResult Create()
        {
            ViewData["Action"] = "Create";
            PreencherCombos();

            return View();
        }

        //
        // POST: /Product/Create

        [HttpPost]
        public JsonResult Create(ProdutoDTO produto)
        {
            ViewData["Action"] = "Create";

            ProdutoBLL produtoBll = new ProdutoBLL();

            produto.DataCadastro = DateTime.Now;

            string errosInterface = produtoBll.Validar(produto);

            if (errosInterface.Length > 0)
            {
                return Json(
               new
               {
                   success = false,
                   erroMessage = errosInterface,
                   sucessMessage = "Novo produto inserido com sucesso!"

               }, JsonRequestBehavior.AllowGet);
            }
            produtoBll.Salvar(produto, GetEstoque());

            return Json(
                new
                {
                    success = true,
                    sucessMessage = "Novo produto inserido com sucesso!"

                }, JsonRequestBehavior.AllowGet);
        }

        
        public ActionResult Pesquisar(int coluna, string pesquisa)
        {
            ProdutoBLL produtoBll = new ProdutoBLL(true);
            int total = 0;
            var listaProdutos = produtoBll.GetListaProdutoDTO(coluna, pesquisa, 0, 10, ref total);

            GridModel<ProdutoDTO> gridModel = new GridModel<ProdutoDTO> { Data = listaProdutos, Total = total };
            return PartialView("_PartialList", gridModel);
        }

        public ActionResult GetListaProduto()
        {
            ProdutoBLL produtoBll = new ProdutoBLL(true);
            int total = 0;
            var listaProdutos = produtoBll.GetListaProdutoDTO(0, null, 0, 10, ref total);

            GridModel<ProdutoDTO> gridModel = new GridModel<ProdutoDTO> { Data = listaProdutos, Total = total };
            return PartialView("_PartialList", gridModel);
        }

       [HttpPost, GridAction(EnableCustomBinding = true)]
        public JsonResult GetListaProduto(GridCommand command)
        {
            ProdutoBLL produtoBll = new ProdutoBLL(true);
            int total = 0;
            var listaProdutos = produtoBll.GetListaProdutoDTO(0, null, command.Page, command.PageSize, ref total);

            GridModel<ProdutoDTO> gridModel = new GridModel<ProdutoDTO> { Data = listaProdutos, Total = total };
            return new JsonResult
            {
                Data = gridModel
            };
        }

        [HttpPost]
        public ActionResult Delete(int id, FormCollection collection)
        {
            try
            {
                // TODO: Add delete logic here

                return RedirectToAction("Index");
            }
            catch
            {
                return View();
            }
        }

        [HttpGet]
        public ActionResult Novo()
        {
            ViewData["Action"] = "Create";
            Session["Estoque"] = null;

            PreencherCombos();

            return PartialView("_PartialRegister", null);
        }

        [HttpGet]
        public ActionResult Editar(int idProduto)
        {
            Session["Estoque"] = null;
            ViewData["Action"] = "Editar";

            ProdutoBLL produtoBll = new ProdutoBLL();
            var produtoDTO = produtoBll.GetProdutoById(idProduto);

            PreencherCombos();

            EstoqueBLL estoqueBll = new EstoqueBLL();
            var listaEstoqueDTO = estoqueBll.ListarEstoque(produtoDTO.Id);
            var estoqueSessao = GetEstoque();

            foreach (var item in listaEstoqueDTO)
            {
                estoqueSessao.Add(item);
            }
            SetEstoque(estoqueSessao);

            return PartialView("_PartialRegister", produtoDTO);
        }

        [HttpPost]
        public ActionResult Editar(ProdutoDTO produto)
        {
            ViewData["Action"] = "Editar";
            ProdutoBLL produtoBll = new ProdutoBLL(true);
            produtoBll.Atualizar(produto, GetEstoque());

            return Json(
               new
               {
                   success = true,
                   sucessMessage = "Produto atualizado com sucesso!"

               }, JsonRequestBehavior.AllowGet);
        }

        [NonAction]
        private List<EstoqueDTO> GetEstoque()
        {
            if (Session["Estoque"] != null)
                return ((List<EstoqueDTO>)Session["Estoque"]);
            return new List<EstoqueDTO>();
        }

        [NonAction]
        private void SetEstoque(List<EstoqueDTO> listaEstoque)
        {
            Session["Estoque"] = listaEstoque;
        }

        public ActionResult ListarEstoque()
        {
            GridModel<EstoqueDTO> gridModel = new GridModel<EstoqueDTO>();
            gridModel.Data = GetEstoque();
            return PartialView("_PartialListaEstoque", gridModel);
        }

        public ActionResult AdicionarEstoque(int quantidade, string tamanho)
        {
            ProdutoBLL produtoBll = new ProdutoBLL();
            SetEstoque(produtoBll.AdicionarEstoque(GetEstoque(), new EstoqueDTO { DataCadastro= DateTime.Now, Quantidade = quantidade, Tamanho = tamanho}));

            GridModel<EstoqueDTO> gridModel = new GridModel<EstoqueDTO>();
            gridModel.Data = GetEstoque();

            return PartialView("_PartialListaEstoque", gridModel);
        }

        public ActionResult GetCategoria(int idProduto)
        {
            var produto = new ProdutoBLL().GetProdutoById(idProduto);
            var categoria = new CategoriaBLL().GetCategoria(produto.IdCategoria);

            return Json(
                new
                {
                    categoria = categoria.IdPai,
                    subcategoria = produto.IdCategoria

                }, JsonRequestBehavior.AllowGet);
        }

        public JsonResult GetCodigo(int idSubcategoria, int? idProduto)
        {
            ProdutoBLL produtoBll = new ProdutoBLL();
            string codigo = produtoBll.GerarCodigo(idProduto);

            return Json(new { Codigo = codigo }, JsonRequestBehavior.AllowGet);
        }
    }
}
